package com.ato.java;

/**
 * @author wangjing
 * @create 2021--08--09--22:50
 */

/**
 * 1：java中允许将一个类A声明在另一个类B中，则A为内部类，B为外部类
 * 2：分类
 *      成员内部类：静态和费静态
 *          1：作为类的成员
 *                  可以调用外部类的方法 外部类.this.methods()
 *                  可以使用static修饰 可以用private protected default 修饰
 *          2：作为类：类里可以定义：属性，方法，构造器，可以被final修饰，修饰后不能被继承
 *      局部内部类：方法内，构造器内，代码块内
 *  3：需要关注的问题
 *      1：如何实例化成员内部类的对象
 *               1：创建静态内部类
 *          A3.StaticNeiBuLei StaticNeiBuLei = new A3.StaticNeiBuLei();
 *                  创建非静态内部类
 *               A3 a3 = new A3(); 先实例化外部类，然后将外部类中的内部类作为类型，并且通过点new 内部类实例化
 *              A3.ChengYuanNeiBuLei c1  = a3.new ChengYuanNeiBuLei();
 *      2：如何在成员内部类中区分调用外部类的结构：方法，属性
 *      3：开发中使用：
 */
public class Leibulei {
    public static void main(String[] args) {
//        1：创建静态内部类
        A3.StaticNeiBuLei StaticNeiBuLei = new A3.StaticNeiBuLei();
//        创建非静态内部类
        A3 a3 = new A3();
        A3.ChengYuanNeiBuLei c1  = a3.new ChengYuanNeiBuLei();
        c1.thisTest("王晶");

    }
}

class A3 {
    String wang = "外部类的变量";
    public void methods1() { }
    //   1: 成员内部类
            //   1-1 非静态内部类
    class ChengYuanNeiBuLei {
        String wang = "内部类的变量";
        public  void thisTest(String wang){
//            如果用外部类的this。应该是外部类.this
//           同理：方法中形参变量名称和内部类中的变量以及外部类中的变量都相同时。
//            1：调用形参的：直接使用
//            2：调用内部类的 this.变量
//            3：调用外部类的 ：外部类.this.变量
            A3.this.methods1();
            System.out.println( "方法形参的" + wang);
            System.out.println("该方法的内部类的变量：" + this.wang);
            System.out.println("该方法所属类的外部类的变量：" + A3.this.wang);
        }
    }

         //   1-2 静态内部类
    static class StaticNeiBuLei {


    }

    public void method() {
//       2:  局部内部类
        class JuBuNeiBuLei {

        }
    }
}